#!/bin/bash

# 前端项目自动部署脚本
# 使用方法: ./deploy.sh [server_config]
#
# 环境变量：
# USE_ZIP_UPLOAD=true          启用ZIP压缩上传模式
# ZIP_UPLOAD_PATH              ZIP文件上传路径（默认: /var/www/erp.lianf.com/）
# DEPLOY_USER                  部署用户（默认: root）
# DEPLOY_SERVER                部署服务器（默认: 47.52.232.210）
# DEPLOY_PATH                  部署路径（默认: /var/www/erp.lianf.com/dist/）
# DEPLOY_PASSWORD              SSH密码（可选，默认使用密钥认证）

set -e  # 遇到错误时退出


# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 默认配置
DEFAULT_USER="root"
DEFAULT_SERVER="47.52.232.210"
DEFAULT_PATH="/var/www/erp.lianf.com/dist/"
DEFAULT_ZIP_PATH="/var/www/erp.lianf.com/"

# 如果提供了配置文件参数，则读取配置
if [ "$1" ]; then
    if [ -f "$1" ]; then
        echo -e "${YELLOW}读取配置文件: $1${NC}"
        source "$1"
    else
        echo -e "${RED}配置文件 $1 不存在${NC}"
        exit 1
    fi
else
    # 使用默认配置或环境变量
    DEPLOY_USER=${DEPLOY_USER:-$DEFAULT_USER}
    DEPLOY_SERVER=${DEPLOY_SERVER:-$DEFAULT_SERVER}
    DEPLOY_PATH=${DEPLOY_PATH:-$DEFAULT_PATH}
    ZIP_UPLOAD_PATH=${ZIP_UPLOAD_PATH:-$DEFAULT_ZIP_PATH}
fi

echo -e "${GREEN}开始部署前端项目...${NC}"
echo "目标服务器: $DEPLOY_USER@$DEPLOY_SERVER:$DEPLOY_PATH"

# 检查是否使用ZIP压缩上传模式
USE_ZIP_UPLOAD=${USE_ZIP_UPLOAD:-"true"}  # 默认启用ZIP模式
if [ "$USE_ZIP_UPLOAD" = "true" ]; then
    echo -e "${YELLOW}使用ZIP压缩上传模式，目标路径: $ZIP_UPLOAD_PATH${NC}"
    ZIP_MODE=true
else
    echo -e "${YELLOW}使用常规文件上传模式${NC}"
    ZIP_MODE=false
fi

# 检查必要工具
if ! command -v npm &> /dev/null; then
    echo -e "${RED}错误: npm 未安装${NC}"
    exit 1
fi

if ! command -v scp &> /dev/null; then
    echo -e "${RED}错误: scp 未安装${NC}"
    exit 1
fi

if ! command -v zip &> /dev/null; then
    echo -e "${RED}错误: zip 未安装${NC}"
    exit 1
fi

# 检查是否使用密码认证
if [ -n "$DEPLOY_PASSWORD" ]; then
    if ! command -v sshpass &> /dev/null; then
        echo -e "${RED}错误: 检测到密码环境变量但 sshpass 未安装${NC}"
        echo "请安装 sshpass: brew install sshpass (macOS) 或 apt-get install sshpass (Ubuntu)"
        exit 1
    fi
    SSH_CMD="sshpass -p '$DEPLOY_PASSWORD' ssh"
    SCP_CMD="sshpass -p '$DEPLOY_PASSWORD' scp"
    echo -e "${YELLOW}使用密码认证连接服务器${NC}"
else
    SSH_CMD="ssh"
    SCP_CMD="scp"
    echo -e "${YELLOW}使用SSH密钥认证连接服务器${NC}"
fi

# 1. 构建项目
echo -e "${YELLOW}1. 构建生产版本...${NC}"
npm run build:prod

if [ $? -ne 0 ]; then
    echo -e "${RED}构建失败！${NC}"
    exit 1
fi

# 检查 dist 目录是否存在
if [ ! -d "dist" ]; then
    echo -e "${RED}错误: dist 目录不存在${NC}"
    exit 1
fi

echo -e "${GREEN}构建完成！${NC}"

# 2. 上传文件
echo -e "${YELLOW}2. 上传文件到服务器...${NC}"

# 测试SSH连接
echo "测试服务器连接..."
if [ -n "$DEPLOY_PASSWORD" ]; then
    if ! $SSH_CMD -o ConnectTimeout=10 "$DEPLOY_USER@$DEPLOY_SERVER" exit &>/dev/null; then
        echo -e "${RED}无法连接到服务器 $DEPLOY_USER@$DEPLOY_SERVER${NC}"
        echo "请检查:"
        echo "1. 服务器地址和用户名是否正确"
        echo "2. 密码是否正确"
        echo "3. 网络连接是否正常"
        exit 1
    fi
else
    if ! $SSH_CMD -o ConnectTimeout=10 -o BatchMode=yes "$DEPLOY_USER@$DEPLOY_SERVER" exit &>/dev/null; then
        echo -e "${RED}无法连接到服务器 $DEPLOY_USER@$DEPLOY_SERVER${NC}"
        echo "请检查:"
        echo "1. 服务器地址和用户名是否正确"
        echo "2. SSH密钥是否已配置"
        echo "3. 网络连接是否正常"
        exit 1
    fi
fi

if [ "$ZIP_MODE" = "true" ]; then
    # ZIP模式部署
    echo -e "${YELLOW}使用ZIP压缩模式部署...${NC}"

    # 创建时间戳
    TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
    ZIP_FILE="dist_${TIMESTAMP}.zip"

    # 压缩dist目录
    echo "压缩dist目录..."
    cd dist
    zip -r "../$ZIP_FILE" .
    cd ..

    if [ ! -f "$ZIP_FILE" ]; then
        echo -e "${RED}压缩失败！${NC}"
        exit 1
    fi

    echo -e "${GREEN}压缩完成: $ZIP_FILE${NC}"

    # 创建目标目录
    $SSH_CMD "$DEPLOY_USER@$DEPLOY_SERVER" "mkdir -p $ZIP_UPLOAD_PATH"

    # 上传ZIP文件
    echo "上传ZIP文件..."
    $SCP_CMD "$ZIP_FILE" "$DEPLOY_USER@$DEPLOY_SERVER:$ZIP_UPLOAD_PATH"

    if [ $? -ne 0 ]; then
        echo -e "${RED}❌ ZIP文件上传失败！${NC}"
        rm -f "$ZIP_FILE"
        exit 1
    fi

    # 在服务器上解压
    echo "在服务器上解压文件..."
    $SSH_CMD "$DEPLOY_USER@$DEPLOY_SERVER" "cd $ZIP_UPLOAD_PATH && rm -rf dist/* && mkdir -p dist/ && unzip -o $ZIP_FILE -d dist/ && rm -f $ZIP_FILE"

    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✅ ZIP部署成功！${NC}"
        echo "网站已更新到: $DEPLOY_USER@$DEPLOY_SERVER:$ZIP_UPLOAD_PATH/dist/"
    else
        echo -e "${RED}❌ 解压失败！${NC}"
        exit 1
    fi

    # 清理本地ZIP文件
    rm -f "$ZIP_FILE"
    echo -e "${GREEN}本地ZIP文件已清理${NC}"

else
    # 常规模式部署
    echo -e "${YELLOW}使用常规模式部署...${NC}"

    # 清理并创建目标目录
    echo "清理旧文件..."
    $SSH_CMD "$DEPLOY_USER@$DEPLOY_SERVER" "rm -rf $DEPLOY_PATH/* && mkdir -p $DEPLOY_PATH"

    # 上传文件
    echo "上传文件..."
    $SCP_CMD -r dist/* "$DEPLOY_USER@$DEPLOY_SERVER:$DEPLOY_PATH"

    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✅ 部署成功！${NC}"
        echo "网站已更新到: $DEPLOY_USER@$DEPLOY_SERVER:$DEPLOY_PATH"
    else
        echo -e "${RED}❌ 上传失败！${NC}"
        exit 1
    fi
fi

# 3. 清理本地构建文件
rm -rf dist
echo -e "${GREEN}本地 dist 目录已清理${NC}"

echo -e "${GREEN}🎉 部署完成！${NC}"
